/***************************************************
 @Name :        小铭同学
 @Time :        2025-09-03
 @Email :       LiaoMingWJ233@163.com
 @Comment :     TCP服务器
 @FileName :    tcp.cpp
 @Version :     1.0
****************************************************/


#include "tcp.h"

// 初始化静态成员变量
TCP* TCP::m_instance = nullptr;

TCP* TCP::instance(QWidget *parent)
{
    if (!m_instance) {
        m_instance = new TCP(parent);
    }
    return m_instance;
}

TCP::TCP(QWidget *parent) : QWidget(parent)
{
    // 初始化GBK编解码器
    m_gbkCodec = QTextCodec::codecForName("GBK");
    if (!m_gbkCodec) {
        qDebug() << "Warning: GBK codec not available!";
    }
    
    // 初始化TCP服务器对象
    tcpServer = new QTcpServer(this);
    
    // 连接信号和槽函数
    connect(tcpServer, &QTcpServer::newConnection, this, &TCP::onNewConnection);   
}

void TCP::startServer()
{
    if (tcpServer->isListening()) {
        return;
    }    
    
    if (!tcpServer->listen(QHostAddress::Any, 8080)) {
        QMessageBox::critical(this, "错误", "无法启动服务器: " + tcpServer->errorString());
        return;
    }   
    
    c=1;
    emit statusChanged_fwd_lj();  // 无参数
    
    //qDebug() << "服务器启动成功";
}

void TCP::stopServer()
{
    // 停止TCP服务器
    if (tcpServer->isListening()) {
        tcpServer->close(); // 关闭服务器监听
    }
    
    // 断开所有客户端连接并清理资源
    for (QTcpSocket *socket : clientSockets) {
        socket->disconnectFromHost(); // 断开连接
        if (socket->state() == QAbstractSocket::ConnectedState) {
            socket->waitForDisconnected(1000); // 等待断开完成
        }
        socket->deleteLater(); // 延迟删除对象
    }
    clientSockets.clear();    // 清空客户端列表
    clientSocket = nullptr;   // 重置当前客户端指针  
    
    d=1;
    emit statusChanged_fwd_dk();  // 无参数
}

void TCP::onNewConnection()
{
    // 处理新客户端连接
    QTcpSocket *socket = tcpServer->nextPendingConnection();
    if (!socket) {
        return; // 如果没有获取到有效的socket，直接返回
    }
    
    // 将新客户端添加到列表
    clientSockets.append(socket);
    qDebug() << "客户端数量:" << clientSockets.size();
    clientSocket = socket; // 设置当前客户端
    
    // 连接客户端socket的信号到对应的槽函数
    connect(socket, &QTcpSocket::readyRead, this, &TCP::onReadyRead);
    connect(socket, &QTcpSocket::disconnected, this, &TCP::onClientDisconnected);
    
    // 获取客户端信息
    QString clientInfo = QString("客户端连接: %1:%2")
                         .arg(socket->peerAddress().toString())
                         .arg(socket->peerPort()); 
    
    
    qDebug() << clientInfo;
    a=1;
    emit statusChanged_khd_lj();  // 无参数
}

QString TCP::onReadyRead()
{
    // 读取客户端发送的数据
    QTcpSocket *socket = qobject_cast<QTcpSocket*>(sender());
    if (!socket) {
        return "error"; // 如果sender不是QTcpSocket，直接返回
    }
    
    // 读取所有可用数据
    QByteArray data = socket->readAll();
    
    // 【核心修改】使用GBK编码解码数据
    QTextCodec *gbkCodec = QTextCodec::codecForName("GBK");
    if (!gbkCodec) {
        qDebug() << "Error: GBK codec not available!";
        return "error";
    }
    QString receivedData = gbkCodec->toUnicode(data);
           
    qDebug() << receivedData; 
    
    // 发射数据接收信号
    emit dataReceived(receivedData);
    
    return receivedData;

}

void TCP::onSendButtonClicked(QString message)
{   
    qDebug() << message; 
    qDebug() << "客户端数量:" << clientSockets.size();
    // 处理发送按钮点击事件
    if (clientSockets.isEmpty()) {
        QMessageBox::warning(this, "警告", "没有客户端连接");
        return; // 如果没有客户端连接，显示警告并返回
    }      

    // 向所有连接的客户端发送数据
    for (QTcpSocket *socket : clientSockets) {
        if (socket->state() == QAbstractSocket::ConnectedState) {
            socket->write(message.toUtf8()); // 发送数据
            socket->flush();                 // 立即发送缓冲区数据
        }
    }
    qDebug() << message;   
}

void TCP::onClientDisconnected()
{
    // 处理客户端断开连接
    QTcpSocket *socket = qobject_cast<QTcpSocket*>(sender());
    if (socket) {
        // 从客户端列表中移除
        clientSockets.removeOne(socket);
        socket->deleteLater(); // 延迟删除对象
        
        // 如果没有客户端连接，重置当前客户端指针
        if (clientSockets.isEmpty()) {
            clientSocket = nullptr;
            b=1;
            emit statusChanged_khd_dk();  // 无参数
        }        
    }
}
